package com.appium.manager.data;

import com.appium.manager.util.YamlUtil;

import java.io.FileNotFoundException;
import java.lang.reflect.Method;

/**
 * <p>
 *     负责测试数据的读取  <br/>
 *     测试数据在YML中的格式如下: <br/>
 *      全类名1:  <br/>
 *         方法名1: 测试数据1-测试数据2-测试数据3-测试数据4  <br/>
 *         方法名2: 测试数据1-测试数据2-测试数据3-测试数据4  <br/>
 *      全类名2:  <br/>
 *         方法名1: 测试数据1-测试数据2-测试数据3-测试数据4  <br/>
 *         方法名2: 测试数据1-测试数据2-测试数据3-测试数据4  <br/>
 *
 * </p>
 * @author 大忽悠
 * @create 2022/7/7 16:15
 */
public class TestDataHandler {
    /**
     * 默认去类路径下寻找appiumTestData.yml数据文件
     */
   public static final String DEFAULT_TEST_DATA_FILE_PATH="appiumTestData.yml";

   public static final String YAML_SEPARATOR=".";

   public static final String TEST_DATA_SEPARATOR="-";

   private final YamlUtil yamlReader;

    public TestDataHandler(String testDataFilePath) {
        yamlReader=new YamlUtil(testDataFilePath);
    }

    public TestDataHandler() {
        yamlReader=new YamlUtil(DEFAULT_TEST_DATA_FILE_PATH);
    }

    /**
     * 读取一个测试数据,如果存在多个也只会返回第一个
     */
    public String getOneTestData(Method curTestMethod) throws FileNotFoundException {
        return getTargetTestDatas(curTestMethod)[0];
    }


    /**
     * 按照下标读取出某个测试数据,如果下标越界,则抛出异常
     */
    public String  getTestDataByIndex(Method curTestMethod,int index) throws FileNotFoundException {
        String[] testDatas = getTargetTestDatas(curTestMethod);
        if(testDatas.length<index){
            throw new RuntimeException("传入的index="+index+" 大于了测试数据的数量");
        }
        return testDatas[index];
    }

    private String[] getTargetTestDatas(Method curTestMethod) throws FileNotFoundException {
        String className= curTestMethod.getDeclaringClass().getName().replace(".","-");
        String methodName= curTestMethod.getName();
        String data = yamlReader.get(className + YAML_SEPARATOR + methodName);
        if(data==null){
            throw new RuntimeException(className + YAML_SEPARATOR + methodName+"在对应的测试数据配置文件中不存在");
        }
        return data.split(TEST_DATA_SEPARATOR);
    }
}
